home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockLoggingFileWriter.js < prev    next >
Text File  |  2007-10-18  |  6KB  |  181 lines

  1. //
  2. // BEGIN FLOCK GPL
  3. // 
  4. // Copyright Flock Inc. 2005-2007
  5. // http://flock.com
  6. // 
  7. // This file may be used under the terms of of the
  8. // GNU General Public License Version 2 or later (the "GPL"),
  9. // http://www.gnu.org/licenses/gpl.html
  10. // 
  11. // Software distributed under the License is distributed on an "AS IS" basis,
  12. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. // for the specific language governing rights and limitations under the
  14. // License.
  15. // 
  16. // END FLOCK GPL
  17. //
  18.  
  19. const CC = Components.classes;
  20. const CI = Components.interfaces;
  21. const CR = Components.results;
  22.  
  23. Components.utils.import("resource:///modules/FlockXPCOMUtils.jsm");
  24. FlockXPCOMUtils.debug = false;
  25.  
  26. const MODULE_NAME = "Flock Logging File Writer";
  27.  
  28. const CLASS_NAME = "Flock Logging File Writer";
  29. const CLASS_ID = Components.ID("{b2045e5e-c742-4dbc-8fae-233f428bc9c0}");
  30. const CONTRACT_ID = "@flock.com/logging-file-writer;1";
  31.  
  32. const LOGGER_FILENAME = "log.txt";
  33.  
  34. /* from nspr's prio.h */
  35. const PR_RDONLY      = 0x01;
  36. const PR_WRONLY      = 0x02;
  37. const PR_RDWR        = 0x04;
  38. const PR_CREATE_FILE = 0x08;
  39. const PR_APPEND      = 0x10;
  40. const PR_TRUNCATE    = 0x20;
  41. const PR_SYNC        = 0x40;
  42. const PR_EXCL        = 0x80;
  43.  
  44. /**************************************************************************
  45.  * Component: Flock Logging File Writer
  46.  **************************************************************************/
  47.  
  48. // Constructor.
  49. function flockLoggingFileWriter()
  50. {
  51.   this._initialized = false;
  52.  
  53.   // Note: This observer is required for the life of the application.
  54.   //       Not removing it anywhere looks like a leak, but in fact it
  55.   //       does not leak until the application exits, at which
  56.   //       point it becomes moot.
  57.   var obs = CC["@mozilla.org/observer-service;1"]
  58.             .getService(CI.nsIObserverService);
  59.   obs.addObserver(this, "profile-after-change", false);
  60. }
  61.  
  62. /**************************************************************************
  63.  * Flock Logging File Writer: XPCOM Component Creation
  64.  **************************************************************************/
  65.  
  66. flockLoggingFileWriter.prototype = new FlockXPCOMUtils.genericComponent(
  67.   CLASS_NAME,
  68.   CLASS_ID,
  69.   CONTRACT_ID,
  70.   flockLoggingFileWriter,
  71.   CI.nsIClassInfo.SINGLETON,
  72.   [
  73.     CI.flockILoggingObserver,
  74.     CI.nsIObserver
  75.   ]
  76. );
  77.  
  78. // FlockXPCOMUtils.genericModule() categories
  79. flockLoggingFileWriter.prototype._xpcom_categories = [
  80.   { category: "flockILoggingObserver" }
  81. ];
  82.  
  83. /**************************************************************************
  84.  * Flock Logging File Writer: Private Data and Functions
  85.  **************************************************************************/
  86.  
  87. // Member variables.
  88. flockLoggingFileWriter.prototype._initialized = null;
  89. flockLoggingFileWriter.prototype._converter = null;
  90. flockLoggingFileWriter.prototype._outputStream = null;
  91.  
  92. flockLoggingFileWriter.prototype._initFile =
  93. function LogFileWriter__initFile() {
  94.   // Prepare the log file for the requested module
  95.   var dirService = CC["@mozilla.org/file/directory_service;1"]
  96.                    .getService(CI.nsIProperties);
  97.   var profileDir = dirService.get("ProfD", CI.nsILocalFile);
  98.   var file = CC["@mozilla.org/file/local;1"].createInstance(CI.nsILocalFile);
  99.   file.initWithPath(profileDir.path);
  100.   file.append(LOGGER_FILENAME);
  101.   if (!file.exists()) {
  102.     // 0600 = -rw------- permissions
  103.     file.createUnique(CI.nsILocalFile.NORMAL_FILE_TYPE, 0600);
  104.   }
  105.  
  106.   var transport = CC["@mozilla.org/network/file-output-stream;1"]
  107.                   .createInstance(CI.nsIFileOutputStream);
  108.   // 0640 = -rw-r----- permissions
  109.   transport.init(file, PR_RDWR | PR_CREATE_FILE | PR_APPEND, 0640, 0);
  110.  
  111.   this._converter = CC["@mozilla.org/intl/scriptableunicodeconverter"]
  112.                     .createInstance(CI.nsIScriptableUnicodeConverter);
  113.   this._converter.charset = "UTF-8";
  114.  
  115.   this._outputStream = CC["@mozilla.org/network/buffered-output-stream;1"]
  116.                        .createInstance(CI.nsIBufferedOutputStream);
  117.   this._outputStream.init(transport, 65536 * 4);  // 256k buffer
  118.  
  119.   this._initialized = true;
  120. }
  121.  
  122. flockLoggingFileWriter.prototype._pad =
  123. function LogFileWriter__pad(aNumber, aPlaces) {
  124.   var numberString = aNumber + "";
  125.   while (numberString.length < aPlaces) {
  126.     numberString = "0" + numberString;
  127.   }
  128.   return numberString;
  129. }
  130.  
  131.  
  132. /**************************************************************************
  133.  * Flock Logging File Writer: flockILoggingService Implementation
  134.  **************************************************************************/
  135.  
  136. flockLoggingFileWriter.prototype.emit =
  137. function LogFileWriter_emit(aDate, aLevel, aContext, aMessage) {
  138.   if (this._initialized) {
  139.     var levels = ["all", "debug", "info", "warn", "error", "fatal"];
  140.     var date = new Date(aDate);
  141.     var dateString = date.toLocaleFormat("%Y-%m-%d %H:%M:%S.")
  142.                    + this._pad(date.getMilliseconds(), 3);
  143.     var content = "[" + dateString + " " + aContext
  144.                 + ":" + levels[aLevel] + "] " + aMessage
  145.                 + "\n";
  146.     var inputStream = this._converter.convertToInputStream(content);
  147.     this._outputStream.writeFrom(inputStream, inputStream.available());
  148.     this._outputStream.flush();
  149.   }
  150. }
  151.  
  152. /**************************************************************************
  153.  * Flock Logging File Writer: nsIObserver Implementation
  154.  **************************************************************************/
  155.  
  156. flockLoggingFileWriter.prototype.observe =
  157. function LogFileWriter_observe(subject, topic, state) {
  158.   switch (topic) {
  159.     case "profile-after-change":
  160.       // init log file
  161.       this._initFile();
  162.       break;
  163.   }
  164. }
  165.  
  166. /**************************************************************************
  167.  * END Flock Logging File Writer
  168.  **************************************************************************/
  169.  
  170.  
  171. /**************************************************************************
  172.  * XPCOM Support - Module Construction
  173.  **************************************************************************/
  174.  
  175. // Create array of components.
  176. var gComponentsArray = [flockLoggingFileWriter];
  177.  
  178. // Generate a module for XPCOM to find.
  179. var NSGetModule = FlockXPCOMUtils.generateNSGetModule(MODULE_NAME,
  180.                                                       gComponentsArray);
  181.